home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 February: Tool Chest / Dev.CD Feb 97 TC.toast / Sample Code / Interapplication Communication / MenuScripter 4.0 / Sources / MSAESave.c < prev    next >
Encoding:
Text File  |  1996-07-09  |  3.8 KB  |  159 lines  |  [TEXT/CWIE]

  1. // MSAESave.c
  2. //
  3. // Original version by Jon Lansdell and Nigel Humphreys.
  4. // 4.0 and 3.1 updates by Greg Sutton.
  5. // ©Apple Computer Inc 1996, all rights reserved.
  6.  
  7. #include "MSAESave.h"
  8.  
  9. #include "MSAEUtils.h"
  10. #include "MSWindow.h"        // for DPtrFromWindowPtr()
  11. #include "MSFile.h"            // for DoSave() etc…
  12. #include "MSAEWindowUtils.h"
  13.  
  14.  
  15. // -----------------------------------------------------------------------
  16. //    Name:             DoSaveWindow
  17. //    Purpose:        Handles the Save AppleEvent.
  18. // -----------------------------------------------------------------------
  19.  
  20. #pragma segment File
  21.  
  22. pascal OSErr DoSaveWindow(const AppleEvent    *theAppleEvent,
  23.                                 AppleEvent    *reply,
  24.                                 long        handlerRefCon)
  25. #ifdef __MWERKS__
  26.     #pragma unused (reply, handlerRefCon)
  27. #endif
  28.  
  29.     AEDesc            directObj = {typeNull, NULL};
  30.     Size            actualSize;
  31.     DescType        returnedType;
  32.     FSSpec            destFSSpec;
  33.     
  34.     WindowToken        aWindowToken;
  35.     OSErr            err;
  36.     
  37.         // pick up the direct object
  38.     err = AEGetParamDesc( theAppleEvent, keyDirectObject, typeWildCard, &directObj );
  39.                                                  
  40.         // pick up optional destination param, if any
  41.     if ( noErr != AEGetParamPtr( theAppleEvent, keyAEFile, typeFSS, &returnedType,
  42.                                         (Ptr)&destFSSpec, sizeof( destFSSpec ), &actualSize ) )
  43.     {
  44.         destFSSpec.vRefNum = 0;
  45.         destFSSpec.parID = 0;
  46.     }
  47.  
  48.     err = GotRequiredParams( theAppleEvent );
  49.     if (noErr != err) goto done;
  50.     
  51.     if ( typeNull != directObj.descriptorType )
  52.         err = SaveDesc( &directObj, &destFSSpec );
  53.     else if ( GetNthDocument( 1 ) )
  54.     {
  55.         aWindowToken.tokenWindow = GetNthDocument( 1 );
  56.     
  57.         err = SaveDocumentToken( &aWindowToken, &destFSSpec );
  58.     }
  59.     else
  60.         err = errAENoSuchObject;
  61.   
  62. done:
  63.     (void)AEDisposeDesc( &directObj );
  64.             
  65.     return err;
  66. }    // DoSaveWindow
  67.  
  68.  
  69. OSErr    SaveDocumentToken(WindowToken* theToken, FSSpec* destFSSpec)
  70. {
  71.     DPtr            docPtr;
  72.     OSErr            err;
  73.     
  74.     docPtr = DPtrFromWindowPtr(theToken->tokenWindow);
  75.     
  76.     if (! docPtr)
  77.         return errAEWrongDataType;
  78.  
  79.     if (docPtr->everSaved == false && ! destFSSpec->vRefNum && ! destFSSpec->parID) 
  80.         return(kAEGenericErr);        // Never been saved and no destination to save
  81.     
  82.     if (destFSSpec->vRefNum || destFSSpec->parID)    // We were given a destination
  83.         err = DoSave(docPtr, *destFSSpec);
  84.     else
  85.         err = SaveUsingTemp(docPtr);
  86.  
  87.     return(err);
  88. }
  89.  
  90.  
  91. OSErr    SaveDocumentDesc(AEDesc* windowDesc, FSSpec* destFSSpec)
  92. {
  93.     WindowToken        aWindowToken;
  94.     Size            actualSize;
  95.     OSErr            err;
  96.  
  97.     if (typeMyDocument != windowDesc->descriptorType)
  98.         return(errAETypeError);
  99.         
  100.     GetRawDataFromDescriptor(windowDesc, (Ptr)&aWindowToken, sizeof(aWindowToken), &actualSize);
  101.  
  102.     err = SaveDocumentToken(&aWindowToken, destFSSpec);
  103.     
  104.     return(err);
  105. }
  106.  
  107.  
  108. OSErr    SaveDesc(AEDesc* aDesc, FSSpec* destFSSpec)
  109. {
  110.     AEDesc        saveDesc = {typeNull, NULL},
  111.                 windowDesc = {typeNull, NULL},
  112.                 itemDesc = {typeNull, NULL};
  113.     long        itemCount,
  114.                 index;
  115.     DescType    theAEKeyword;
  116.     OSErr        err;
  117.     
  118.     if (typeObjectSpecifier == aDesc->descriptorType)
  119.         err = AEResolve(aDesc, kAEIDoMinimum, &saveDesc);
  120.     else if (typeNull != aDesc->descriptorType)
  121.         err = AEDuplicateDesc(aDesc, &saveDesc);
  122.         
  123.     if (noErr != err) goto done;
  124.     
  125.     switch (saveDesc.descriptorType)
  126.     {
  127.         case typeAEList:
  128.             err = AECountItems(&saveDesc, &itemCount);
  129.             if (noErr != err) goto done;
  130.             
  131.             for (index = 1; index <= itemCount; index++)    // Do front back order
  132.             {
  133.                 err = AEGetNthDesc(&saveDesc, index, typeWildCard, &theAEKeyword, &itemDesc);
  134.                 if (noErr != err) goto done;
  135.                 
  136.                 err = SaveDesc(&itemDesc, destFSSpec);        // Call recursively
  137.                 if (noErr != err) goto done;
  138.  
  139.                 if (itemDesc.dataHandle)
  140.                     AEDisposeDesc(&itemDesc);
  141.             }
  142.             break;
  143.             
  144.         default:
  145.             err = AECoerceDesc(&saveDesc, typeMyDocument, &windowDesc);
  146.             if (noErr != err) goto done;
  147.             err = SaveDocumentDesc(&windowDesc, destFSSpec);
  148.     }
  149.     
  150. done:
  151.     (void)AEDisposeDesc(&saveDesc);
  152.     (void)AEDisposeDesc(&windowDesc);
  153.     (void)AEDisposeDesc(&itemDesc);
  154.     
  155.     return(err);
  156. }
  157.  
  158.